/*
 * leerSector.c
 *
 *  Created on: 09/09/2011
 *      Author: Power Rangers Turbo C
 */
#define SECTOR_LENGTH 512
#define SECTORES_POR_PAGINA 8//paginas de 4096 bytes
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <errno.h>
#include "operacionesSectores.h"

//este leer sector es temporal, despues va a pedir la pagina que va a estar en una cache probablemente.

char *leerSector(int numeroSector, char* regionDeMemoria) {
	char *contenedor;
	//char *datosExtraidos;
	//int numeroPagina;
	int desplazamientoEnMemoria;
	//int i;

	contenedor= (char*)malloc(sizeof(char)*SECTOR_LENGTH);
	// Caclculo nro de pagina.
	//numeroPagina = sectorAPagina(numeroSector);

	//Calculo el desplazamiento sobre la region donde se mapeo.
	desplazamientoEnMemoria =numeroSector*SECTOR_LENGTH;

	//Pongo en un puntero la pagina del archivo disco obtenida con mmap(). Lo hago con PROT_READ para q solo se pueda leer
	//datosExtraidos = mmap((caddr_t) 0, getpagesize(), PROT_READ, MAP_SHARED,
	//		descriptorArchivo, numeroPagina * getpagesize()); //(caddr_) 0 es para que el SO decida la ubicacion en memoria que va a tener

	/*posix_madvise(datosExtraidos, getpagesize(), int advice);
	 * aca solo le tengo que avisa por socket al planificador que esta pagina se uso
	 * y con un algoritmo de cache ira viendo que advise darle
	 *
	 * POSIX_MADV_WILLNEED
	 * POSIX_MADV_DONTNEED
	 * fijandose en las colas si la pagina se va a necesitar ,etc*/

	//Copio la parte de la pagina que quiero al contenedor del sector.
	memcpy(contenedor, regionDeMemoria + desplazamientoEnMemoria, SECTOR_LENGTH);
	/*
	for (i = desplazamientoEnMemoria;
			i < desplazamientoEnMemoria + SECTOR_LENGTH; i++) {
		contenedor[i - desplazamientoEnMemoria] = regionDeMemoria[i];
	}*/
	//Libero la memoria usada en el mmap()
	//munmap(datosExtraidos, getpagesize());

	return contenedor;
}

void escribirSector(int numeroSector, char *contenedorAGrabar,
		char* regionDeMemoria,long int fileSize) {
	//int numeroPagina;
	int desplazamientoEnMemoria;
	//char *datosExtraidos;
	//int i;

	// Caclculo nro de pagina.
	//numeroPagina = sectorAPagina(numeroSector);

	//Calculo el desplazamiento sobre la region de memoria donde se mapeo.
	desplazamientoEnMemoria =numeroSector* SECTOR_LENGTH;

	//Pongo en un puntero la pagina del archivo disco obtenida con mmap().  lo hago con PROT_WRITE para escribir.
	//datosExtraidos = mmap((caddr_t) 0, getpagesize(), PROT_WRITE, MAP_SHARED,
			//descriptorArchivo, numeroPagina * getpagesize()); //(caddr_) 0 es para que el SO decida la ubicacion en memoria que va a tener

	//Copio el sector a la pagina mapeada en memoria.
	memcpy(regionDeMemoria + desplazamientoEnMemoria,contenedorAGrabar, SECTOR_LENGTH);
	/*
	for (i = desplazamientoEnMemoria;
			i < desplazamientoEnMemoria + SECTOR_LENGTH; i++) {
		 regionDeMemoria[i]=contenedorAGrabar[i - desplazamientoEnMemoria];
	}*/
	//desmapeo para asegura q se escriba el archivo, por ahi mas adelante uso msync() q hace lo mismo pero sin desmapear
	//munmap(datosExtraidos, getpagesize());

	msync(regionDeMemoria,fileSize,MS_SYNC);//para forzar la actualizacion del archivo en disco.
}

int sectorAPagina(int sector) {
	return (sector / SECTORES_POR_PAGINA);//en desuso
}

